package com.company.common.util;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.company.common.enums.RedisKeyEnum;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * Description: cdndownLoad
 * Created by hekai on 2021/4/13 11:15
 */
public class RedisExistUtil {

    public static String groupKeyId(RedisKeyEnum redisKeyEnum,String id){
        return redisKeyEnum.getKey()+":"+id;
    }

    /**
     * 判断是否存在某个值
     * @param redisKeyEnum
     * @param id
     * @return true or false 即 存在或不存在
     */
    public static boolean existRedis(RedisKeyEnum redisKeyEnum,String id){
        return RedisUtil.hasKey(groupKeyId(redisKeyEnum, id));
    }

    public static String get(RedisKeyEnum redisKeyEnum,String id){
        return RedisUtil.get(groupKeyId(redisKeyEnum,id));
    }

    /**
     * 有一个不存在就返回false,如果集合为空也会返回false
     * @param redisKeyEnum key枚举
     * @param ids 集合，需要封装
     * @return
     */
    public static boolean existRedis(RedisKeyEnum redisKeyEnum, List<String> ids){
        //集合有值
        if(CollUtil.isNotEmpty(ids)){
            for (String id : ids) {
                //不存在
                if(!existRedis(redisKeyEnum, id)){
                    return false;
                }
            }
            return true;
        }else{
            return false;
        }
    }

    /**
     * 有一个不存在就返回false,如果集合为空也会返回false
     * @param redisKeyEnum key枚举
     * @param ids 数组，多个参数用逗号可以隔开
     * @return
     */
    public static boolean existRedis(RedisKeyEnum redisKeyEnum, String... ids){
        //集合有值
        if(CollUtil.isNotEmpty(Arrays.asList(ids))){
            return existRedis(redisKeyEnum,Arrays.asList(ids));
        }
        return false;
    }

    /**
     * 使ID对象在 Redis 中失效的方法，注意使用在事务处理之后
     * @param redisKeyEnum
     * @param ids
     * @return
     */
    public static boolean deadlineIds(RedisKeyEnum redisKeyEnum, List<String> ids){
        for (String id:ids) {
            if(!RedisUtil.del(groupKeyId(redisKeyEnum,id))){
                return false;
            }
        }
        return true;
    }

    /**
     * 使ID对象在 Redis 中失效的方法，注意使用在事务处理之后
     * @param redisKeyEnum
     * @param ids
     * @return
     */
    public static boolean deadlineIds(RedisKeyEnum redisKeyEnum, String... ids){
        return deadlineIds(redisKeyEnum, Arrays.asList(ids));
    }

    /**
     * 获取存在redis中hash表类型的对象
     * @param clazz
     * @param redisKeyEnum
     * @param id
     * @param <T>
     * @return
     */
    public static <T> T getObjectInRedis(Class<T> clazz,RedisKeyEnum redisKeyEnum,String id){
        //不存在返回null
        if(!existRedis(redisKeyEnum,id)){
            return null;
        }
        //获取map
        Map redisMap = RedisUtil.hGetAll(groupKeyId(redisKeyEnum,id));
        //装成bean
        return BeanUtil.mapToBean(redisMap,clazz,true);
    }
}
